import { app } from 'electron'
import path from 'path'
import fs from 'fs'

export interface LoginConfig {
  loginId?: string
  loginKey?: string
  rememberCredentials?: boolean
}

export interface Settings {
  theme: 'light' | 'dark' | 'auto'
  enableNotification: boolean
  autoSave: boolean
  developerMode: boolean
}

interface Config {
  login: LoginConfig
  settings: Settings
}

/**
 * 配置管理器
 * 用于读取和保存应用配置
 */
class ConfigManager {
  private configPath: string
  private config: Config

  constructor() {
    // 开发环境保存到可执行文件目录的 temp/config 文件夹，生产环境保存到用户数据目录
    const configDir =
      process.env.NODE_ENV === 'development'
        ? path.join(path.dirname(process.execPath), 'temp', 'config')
        : app.getPath('userData')

    this.configPath = path.join(configDir, 'config.json')
    this.config = this.loadConfig()
  }

  /**
   * 从文件加载配置
   */
  private loadConfig(): Config {
    try {
      if (fs.existsSync(this.configPath)) {
        const data = fs.readFileSync(this.configPath, 'utf-8')
        return JSON.parse(data)
      }
    } catch (error) {
      console.error('加载配置文件失败:', error)
    }
    // 返回默认配置
    return {
      login: {},
      settings: {
        theme: 'auto',
        enableNotification: true,
        autoSave: true,
        developerMode: false
      }
    }
  }

  /**
   * 获取指定的配置
   */
  getConfig(key: keyof Config): Config[typeof key] {
    return this.config[key] || ({} as Config[typeof key])
  }

  /**
   * 保存配置
   */
  setConfig<K extends keyof Config>(key: K, value: Config[K]): void {
    this.config[key] = value as Config[K] & Config[keyof Config]
    this.saveConfig()
  }

  /**
   * 保存配置到文件
   */
  private saveConfig(): void {
    try {
      const dir = path.dirname(this.configPath)
      if (!fs.existsSync(dir)) {
        fs.mkdirSync(dir, { recursive: true })
      }
      fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2), 'utf-8')
    } catch (error) {
      console.error('保存配置文件失败:', error)
    }
  }
}

export default ConfigManager
